package com.egao.common.component.crawler.gongkao;

import com.egao.common.module.cms.entity.Official;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;

/**
 * 公考网公务员信息爬虫
 *
 * @author pyx
 */
public class GongKaoProcessor implements PageProcessor {
    /**
     * 爬虫站点配置
     * 重试次数 1
     * 爬取间隔 2s
     */
    private Site site = Site.me().setRetrySleepTime(1).setSleepTime(2000);

    private static Integer type;

    /**
     * 公考网公务员信息列表地址
     * '@'代表公务员分类
     * 1~7是武汉7所211
     * 不爬取5,5是中南财经政法大学
     */
    private static final String URL_LIST = "http://www\\.chinagwy\\.org/html/zkgg@_\\d+\\.html";

    /**
     * 公务员信息详情地址
     */
    private static final String URL_POST = "http://www\\.chinagwy\\.org/html/gdzk/\\w+/\\d+/\\w+\\.html";

    /**
     * 构建爬虫内容
     *
     * @param page page
     */
    public void buildPage(Page page) {
        page.putField("title", page.getHtml().xpath("//div[@class='c_l_c_2']/h1[1]/text()").toString());
        page.putField("url", page.getUrl().get());
        page.putField("officialTime", page.getHtml().xpath("//div[@class='c_l_c_3']/text()").toString().substring(30, 46));
        page.putField("source", page.getHtml().xpath("//div[@class='c_l_c_3']/span[1]/text()").toString());
        page.putField("content", page.getHtml().xpath("//div[@class='c_l_c_06_5']/html()").toString());
        page.putField("crawlerId", type);
    }

    @Override
    public void process(Page page) {
        // 如果当前页面为列表页
        // 加入待爬取链接
        // 加入待爬取链接的有本页面中的详情链接以后后续的翻页链接
        if (!page.getUrl().regex(URL_POST).match()) {
            String title = page.getHtml().xpath("//title/text()").toString();
            if ("公务员".equals(title)) {
                type = 1;
            } else if ("事业单位".equals(title)) {
                type = 2;
            } else if ("政法干警".equals(title)) {
                type = 3;
            } else if ("地方招警".equals(title)) {
                type = 4;
            } else if ("教师招聘".equals(title)) {
                type = 5;
            } else if ("村官".equals(title)) {
                type = 6;
            } else if ("三支一扶".equals(title)) {
                type = 7;
            }
            // 详情链接加入待爬取列队中
            page.addTargetRequests(page.getHtml().links().regex(URL_POST).all());

            // 确认并替换当前列表页类型
            int i = page.getUrl().get().indexOf("_");
            String category = page.getUrl().get().substring(33, i);
            Selectable regex1 = page.getHtml().links().regex(URL_LIST.replace("@", category));
            page.addTargetRequests(page.getHtml().links().regex(URL_LIST.replace("@", category)).all());
        } else {
            buildPage(page);
        }
    }

    @Override
    public Site getSite() {
        return site;
    }

    /**
     * 开始爬虫
     *
     * @param list 装载结果的容器
     * @param url  需要爬取的首页列表地址(单个)
     */
    public void start(List<Official> list, String url) {
        GongKaoPipeline gongKaoPipeline = new GongKaoPipeline(list);
        Spider oschinaSpider = Spider.create(new GongKaoProcessor())
                // 加入需要爬取的首页列表
                .addUrl(url)
                // 加入处理爬取结果对象
                .addPipeline(gongKaoPipeline);
        gongKaoPipeline.setOschinaSpider(oschinaSpider);
        // 1个线程执行
        oschinaSpider.thread(1).run();
    }

}
